一、gdb借助core文件快速定义错误
    1、Ubuntu系统默认情况不会产生core文件
        ulimit -c unlimited 设置让操作系统在进程出错的情况下产生core文件
        也可以把此命令记录到用户主目录下的 .bashrc文件中
    2、编译代码时增加 -g 参数 （再次）
        编译时添加调试信息
    3、运行带调试信息的程序
        此时产生的core文件才是能跟gdb配合
    4、使用gdb+core运行程序
        gdb ./a.out core
    5、run/where 命令可以快速定位错误

二、参考printf的调试方法来理解gdb
    1、编译代码时增加 -g 参数
    2、使用 l命令查看代码
        l 默认显示下面10行代码
        l函数名 查看某个函数的代码。
        l行号 
    3、思考在哪里打断点，断点就是让程序在某一行停下来不在运行。
    4、模拟printf的操作，查看变量的信息
        print 变量名
    5、continue 跳过断点，继续执行
    6、单步
        s 执行一行源程序代码，如果此行代码中有函数调用，则进入该函数；
        n 执行一行源程序代码，此行代码中的函数调用也一并执行。

三、使用gdb调试死锁
    1、ps -aux | grep "程序名" 查询进程ID
    2、sudo gdb -p 进程ID
    3、thread app all bt
    4、按return键显示所有线程的栈信息